package org.example._03_consumer_model;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;

/**
 * RocketMQ发送消息方式:
 * 业务：1.处理本服务业务逻辑 2.发送消息  3.处理减少操作
 *
 * 1.同步发送:消息发送到mq中必须要等mq持久化成功以后才能够执行后面的业务逻辑
 * 2.异步发送:消息发送到mq中不需要等mq持久化成功以后才能够执行后面的业务逻辑(明显异步的性能高些)
 * 3.一次性发送:消息发送到mq中,就可以执行后面业务逻辑了,注意一次性发送没有返回结果(不关心信息有没有保留成功)
 */
public class Producer {
    public static void main(String[] args) throws Exception {
        //1 创建一个生产者对象, 并且指定一个生产者组(一个组里有多个生产者,多个生产者可在同一个组里面)
        DefaultMQProducer defaultMQProducer = new DefaultMQProducer("rocketmq-producer");
        //2 设置名字服务的地址(和 nameser 进行绑定)
        //如果出现 No route info of this topic 错误时,就是生产者找不到 rocketmq 了,可能是端口号写错了亦或者 mq 服务挂掉了(重启下)
        defaultMQProducer.setNamesrvAddr("127.0.0.1:9876");
        //3 启动生产者
        defaultMQProducer.start();
        //4 创建一个消息对象,把数据封装到消息对象中
        Message message = new Message(
                "consumer-model",//第一个参数  topic  主题
                "tagA", //可选参数 标签
                "hello,rocketmq".getBytes("utf-8")//第二个参数 byte[] 新消息内容
        );
        //5 发送消息(此处是同步发送消息)
        SendResult sendResult = defaultMQProducer.send(message);
        System.out.println(sendResult.getMsgId());//没输出表示失败了
        //6 关闭连接(关闭资源)
        defaultMQProducer.shutdown();
    }
}